package cn.orangelite.ai.service.impl;

import cn.hutool.core.io.IoUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
import cn.orangelite.ai.domain.AiGptKey;
import cn.orangelite.ai.domain.dto.ChatBodyDTO;
import cn.orangelite.ai.domain.dto.ChatDTO;
import cn.orangelite.ai.mapper.AiGptKeyMapper;
import cn.orangelite.ai.service.IAiGptKeyService;
import cn.orangelite.ai.wss.WebSocketServer;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.orangelite.common.core.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * gptkey
 Service业务层处理
 *
 * @author dongfaqing
 * @date 2024-01-16
 */
@Service
public class AiGptKeyServiceImpl extends ServiceImpl<AiGptKeyMapper,AiGptKey> implements IAiGptKeyService
{
    @Autowired
    private AiGptKeyMapper aiGptKeyMapper;

    private static final ExecutorService executorService = Executors.newFixedThreadPool(5);

    /**
     * 查询gptkey

     *
     * @param id gptkey
    主键
     * @return gptkey

     */
    @Override
    public AiGptKey selectAiGptKeyById(Long id)
    {
        return aiGptKeyMapper.selectAiGptKeyById(id);
    }

    /**
     * 查询gptkey
     列表
     *
     * @param aiGptKey gptkey

     * @return gptkey

     */
    @Override
    public List<AiGptKey> selectAiGptKeyList(AiGptKey aiGptKey)
    {
        return aiGptKeyMapper.selectAiGptKeyList(aiGptKey);
    }

    /**
     * 新增gptkey

     *
     * @param aiGptKey gptkey

     * @return 结果
     */
    @Override
    public int insertAiGptKey(AiGptKey aiGptKey)
    {
        aiGptKey.setCreateTime(DateUtils.getNowDate());
        return aiGptKeyMapper.insertAiGptKey(aiGptKey);
    }

    /**
     * 修改gptkey

     *
     * @param aiGptKey gptkey

     * @return 结果
     */
    @Override
    public int updateAiGptKey(AiGptKey aiGptKey)
    {
        return aiGptKeyMapper.updateAiGptKey(aiGptKey);
    }

    /**
     * 批量删除gptkey

     *
     * @param ids 需要删除的gptkey
    主键
     * @return 结果
     */
    @Override
    public int deleteAiGptKeyByIds(Long[] ids)
    {
        return aiGptKeyMapper.deleteAiGptKeyByIds(ids);
    }

    /**
     * 删除gptkey
     信息
     *
     * @param id gptkey
    主键
     * @return 结果
     */
    @Override
    public int deleteAiGptKeyById(Long id)
    {
        return aiGptKeyMapper.deleteAiGptKeyById(id);
    }

    @Override
    public void gptChat(ChatDTO chatDTO) {
        String model = chatDTO.getType()==3 ? "gpt-3.5-turbo-16k" : "gpt-4";

        ChatBodyDTO chatBodyDTO = new ChatBodyDTO();
        chatBodyDTO.setStream(true);
        chatBodyDTO.setModel(model);
        chatBodyDTO.setMessages(chatDTO.getMessages());

        AiGptKey aiGptKey = new AiGptKey();
        List<AiGptKey> aiGptKeys = aiGptKeyMapper.selectAiGptKeyList(aiGptKey);
        Collections.shuffle(aiGptKeys);


        //gpt请求
        HttpResponse request = HttpRequest.post("https://api.openai.com/v1/chat/completions")
                .contentType("application/json")
                .header("Authorization", "Bearer "+aiGptKeys.get(0).getKey())
                .body(JSONUtil.toJsonStr(chatBodyDTO))
                .executeAsync();
        InputStream inputStream = request.bodyStream();

        aiGptKey = aiGptKeys.get(0);
        aiGptKey.setUseNumber(aiGptKey.getUseNumber()+1);
        aiGptKeyMapper.updateAiGptKey(aiGptKey);

        // 异步处理输出流
        executorService.execute(() -> {
            // 使用 BufferedReader 逐行读取输入流
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
                StringBuilder jsonBuilder = new StringBuilder();
                boolean isJsonStarted = false;

                String line;
                while ((line = reader.readLine()) != null) {
                    if (line.startsWith("data:") || line.equals("")) {
//                        if(!line.equals("") && !line.equals("data: [DONE]")){
                        if(!line.equals("")){
                            // 去除 "data:" 前缀
                            line = line.substring("data:".length()).trim();
                            // 处理正常文本
                            WebSocketServer.sendInfo(chatDTO.getUserId(), line);
                        }
                    }else{
                        if (!isJsonStarted && line.equals("{")) {
                            // 标记 JSON 开始
                            isJsonStarted = true;
                        }

                        if (isJsonStarted) {
                            // 追加到 JSON 构建器
                            jsonBuilder.append(line.trim());

                            // 判断是否到达 JSON 结束
                            if (line.equals("}")) {
                                // 完整的 JSON 字符串，处理错误信息
                                WebSocketServer.sendInfo(chatDTO.getUserId(),jsonBuilder);
                                // 重置状态
                                isJsonStarted = false;
                                jsonBuilder.setLength(0);
                            }
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 关闭输入流
                IoUtil.close(inputStream);
            }
        });
    }

}
